package 接口参数_局部内部类的应用;
/*
 * 方法一最常用
 * 在方法中，接口类可以当做参数，把实现好的类传入接口参数中
 */
public class TestProduct {
	public static void main(String[] args) {
		TestProduct t = new TestProduct();
		//方法一：创建一个实现Product接口的类的对象，并将此传入方法中
		NoteBook n = new NoteBook();
//匿名类
		t.show(n);
		//方法二：创建一个实现Product接口的匿名类的对象(同方法三)
		Product p = new Product() {
			@Override
			public void getName() {
				System.out.println("Thinkpad X1隐士");
			}
			@Override
			public void getPrice() {
				System.out.println("¥18999");
			}
		};
		TestProduct t1 = new TestProduct();
		t1.show(p);
		//方法三：创建一个实现Product接口的匿名类的匿名对象
		t.show(new Product() {
			@Override
			public void getName() {
				System.out.println("小米笔记本Pro");
			}
			@Override
			public void getPrice() {
				System.out.println("¥6800");
			}		
		});
		//局部内部类
		Product p2 = t.getProduct();
		t.show(p2);
	}
//局部内部类
	public Product getProduct() {
		//方法一：实现Product接口的局部内部类
		class Camera implements Product{
			@Override
			public void getName() {
				System.out.println("DELLXPS13.3");
			}
			@Override
			public void getPrice() {
				System.out.println("¥10999");
			}
		}
		return new Camera();
		//方法二：实现Product接口的匿名局部内部类
//		return new Product() {
//			public void getName() {
//				System.out.println("DELLXPS13.3");
//			}
//			@Override
//			public void getPrice() {
//				System.out.println("¥10999");
//			}
//		};
	}
	
	
	
	
	public void show(Product p) {
		p.getName();
		p.getPrice();
	}
}
interface Product{
	void getName();
	void getPrice();
}
class NoteBook implements Product{

	@Override
	public void getName() {
		System.out.println("MacBook Pro");
	}

	@Override
	public void getPrice() {
		System.out.println("¥16844");
	}
	
}